﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace Prueba.Model
{

    public class ColFdv:ModelBase
    {
        public bool IsDataModified
        {
            get { return _IsDataModified; }
            set
            {
                if (_IsDataModified != value)
                {
                    _IsDataModified = value;
                    OnPropertyChanged(IsDataModifiedPropertyName);
                }
            }
        }
        private bool _IsDataModified;
        public const string IsDataModifiedPropertyName = "IsDataModified";
        public Pos Pos
        {
            get { return _Pos; }
            set
            {
                if (_Pos != value)
                {
                    _Pos = value;
                    OnPropertyChanged(PosPropertyName);
                }
            }
        }
        private Pos _Pos;
        public const string PosPropertyName = "Pos";

        //public ColFdvIndexer ColFdvIndexer
        //{
        //    get { return _ColFdvIndexer; }
        //    set
        //    {
        //        if (_ColFdvIndexer != value)
        //        {
        //            _ColFdvIndexer = value;
        //            OnPropertyChanged(ColFdvIndexerPropertyName);
        //        }
        //    }
        //}
        private ColFdvIndexer _ColFdvIndexer;
        public const string ColFdvIndexerPropertyName = "ColFdvIndexer";

        public Recurso Recurso
        {
            get { return _Recurso; }
            set
            {
                if (_Recurso != value)
                {
                    _Recurso = value;
                    OnPropertyChanged(RecursoPropertyName);
                }
            }
        }
        private Recurso _Recurso;
        public const string RecursoPropertyName = "Recurso";

        public int Cantidad
        {
            get { return _Cantidad; }
            set
            {
                if (_Cantidad != value)
                {
                    this.IsDataModified = true;
                    _Cantidad = value;
                    this.CalcularIndicadores();
                    OnPropertyChanged(CantidadPropertyName);
                }
            }
        }
        private int _Cantidad;
        public const string CantidadPropertyName = "Cantidad";

        public bool IsCellAlarmed
        {
            get 
            { 
                return this.Pos.IsOneRuleExceded || this.Recurso.IsMaximoAsignadoEx; 
            }
            set
            {
                ;
            }
        }
        //OnPropertyChanged(IsCellAlarmedPropertyName);
        public const string IsCellAlarmedPropertyName = "IsCellAlarmed";

        public ColFdv(Pos pos, Recurso rec, int cantidad, ColFdvIndexer colFdvIndexer)
        {
            this._Pos = pos;
            this._Recurso = rec;
            this._Cantidad = cantidad;
            this._ColFdvIndexer = colFdvIndexer;
            this._IsDataModified = false;
        }

        public void CalcularIndicadores()
        {
            //Tiempo Implementacion
            int tiempoImplementacion=0;
            int visitasSugeridas = 0;
            int numRecursos=0;
            List<string> distinctIniciativas=new List<string>();

            foreach(KeyValuePair<string,ColFdv> entry in this._ColFdvIndexer._cols)
            {
                //Cálculo del TiempoImplementacion
                tiempoImplementacion += (entry.Value.Recurso.TiempoImplementacion * entry.Value.Cantidad);

                if (entry.Value.Cantidad != 0)
                {
                    //Cálculo de las VisitasSugeridas
                    if (entry.Value.Recurso.VisitasSugeridas > visitasSugeridas)
                    {
                        visitasSugeridas = entry.Value.Recurso.VisitasSugeridas;
                    }

                    //Cálculo de Recursos
                    if (!entry.Value.Recurso.ExcluirReglaRecurso)
                    {
                        numRecursos++;
                    }

                    //Cálculo de Iniciativas
                    if (!entry.Value.Recurso.ExcluirReglaIniciativa)
                    {
                        //numIniciativas++;
                        if(!distinctIniciativas.Contains(entry.Value.Recurso.Iniciativa.IniciativaId))
                        {
                            distinctIniciativas.Add(entry.Value.Recurso.Iniciativa.IniciativaId);
                        }
                    }
                }
            }

            //Asignar a total por pos
            this.Pos.TiempoImplementacion = tiempoImplementacion;
            this.Pos.VisitasSugeridas = visitasSugeridas;
            this.Pos.Recursos = numRecursos;
            this.Pos.Iniciativas = distinctIniciativas.Count;

            //Regla de maximos e iniciativas
            if (numRecursos > this.Recurso.MaxRecursos || distinctIniciativas.Count > this.Recurso.MaxIniciativas)
            {
                this.Pos.IsOneRuleExceded = true;
                this.OnPropertyChanged(IsCellAlarmedPropertyName);
            }
            else
            {
                this.Pos.IsOneRuleExceded = false;
                this.OnPropertyChanged(IsCellAlarmedPropertyName);
            }

        }
    }
}
